D:\a\scloud-dns\scloud-dns\src\main.rs
Line | Count | Source |
1 | | use crate::config::Config; |
2 | | use crate::exceptions::SCloudException; |
3 | | use crate::workers::manager::StartGate; |
4 | | use crate::workers::{SCloudWorker, WorkerType}; |
5 | | use std::path::Path; |
6 | | use std::sync::Arc; |
7 | | use tokio::sync::mpsc; |
8 | | |
9 | | mod config; |
10 | | mod dns; |
11 | | mod exceptions; |
12 | | mod utils; |
13 | | mod workers; |
14 | | |
15 | | #[tokio::main(flavor = "multi_thread", worker_threads = 8)] |
16 | 0 | async fn main() -> Result<(), SCloudException> { |
17 | 0 | let config = Config::from_file(Path::new("./config/config.json"))?; |
18 | 0 | utils::logging::init(config.logging.clone())?; |
19 | | |
20 | | #[cfg(target_os = "windows")] |
21 | | { |
22 | | use tokio::net::UdpSocket; |
23 | | use std::sync::Arc; |
24 | | use workers::types::listener::SHARED_UDP_SOCKET; |
25 | | |
26 | 0 | let udp = UdpSocket::bind("0.0.0.0:5353") |
27 | 0 | .await |
28 | 0 | .map_err(|_| SCloudException::SCLOUD_WORKER_LISTENER_BIND_FAILED)?; |
29 | | // Buffer large pour compenser l'absence de SO_REUSEPORT |
30 | | // Le socket reçoit tout, les workers Tokio se partagent les appels recv_from |
31 | 0 | SHARED_UDP_SOCKET.set(Arc::new(udp)).ok(); |
32 | | } |
33 | | |
34 | 0 | let gate = Arc::new(StartGate::new(1)); |
35 | | |
36 | 0 | let mut workers: Vec<Arc<SCloudWorker>> = vec![ |
37 | 0 | Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?), |
38 | 0 | Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?), |
39 | 0 | Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?), |
40 | 0 | Arc::new(SCloudWorker::new(WorkerType::DECODER)?), |
41 | 0 | Arc::new(SCloudWorker::new(WorkerType::DECODER)?), |
42 | 0 | Arc::new(SCloudWorker::new(WorkerType::DECODER)?), |
43 | 0 | Arc::new(SCloudWorker::new(WorkerType::DECODER)?), |
44 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?), |
45 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?), |
46 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?), |
47 | 0 | Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?), |
48 | 0 | Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?), |
49 | 0 | Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?), |
50 | 0 | Arc::new(SCloudWorker::new(WorkerType::ZONE_MANAGER)?), |
51 | 0 | Arc::new(SCloudWorker::new(WorkerType::ZONE_MANAGER)?), |
52 | 0 | Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?), |
53 | 0 | Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?), |
54 | 0 | Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?), |
55 | 0 | Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?), |
56 | 0 | Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?), |
57 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?), |
58 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?), |
59 | 0 | Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?), |
60 | 0 | Arc::new(SCloudWorker::new(WorkerType::ENCODER)?), |
61 | 0 | Arc::new(SCloudWorker::new(WorkerType::ENCODER)?), |
62 | 0 | Arc::new(SCloudWorker::new(WorkerType::ENCODER)?), |
63 | 0 | Arc::new(SCloudWorker::new(WorkerType::SENDER)?), |
64 | 0 | Arc::new(SCloudWorker::new(WorkerType::SENDER)?), |
65 | 0 | Arc::new(SCloudWorker::new(WorkerType::SENDER)?), |
66 | | ]; |
67 | | |
68 | 0 | workers::manager::channels_generation::generate_channels(workers.clone()).await; |
69 | 0 | workers.sort_by_key(|w| w.get_worker_id()); |
70 | | |
71 | 0 | let mut handles: Vec<tokio::task::JoinHandle<()>> = Vec::new(); |
72 | 0 | for w in workers { |
73 | 0 | handles.push(workers::spawn_worker(w, gate.clone())); |
74 | 0 | } |
75 | | |
76 | 0 | futures_util::future::pending::<()>().await; |
77 | 0 | Ok(()) |
78 | 0 | } |